package controller

import (
	"bytes"
	"encoding/base64"
	"github.com/gin-gonic/gin"
	"github.com/skip2/go-qrcode"
	"github.com/typa01/go-utils"
	"image/color"
	"image/png"
	"os"
	"wish_go/src/main/com/ajie/common"
	"wish_go/src/main/com/ajie/dao"
	"wish_go/src/main/com/ajie/model"
	"wish_go/src/main/com/ajie/result"
)

// @Tags 二维码
// @Summary 生成单张二维码
// @Produce json
// @Param url query string true "访问地址"
// @Success 200 {object} result.Result "{"code": 200, "message": "二维码生成成功", "data": ""}"
// @Failure 500 {object} result.Result "{ "code": 500, "message": "异常信息" }"
// @Router /gen/code [GET]
func GenCode(req *gin.Context) {
	content, b := req.GetQuery("url")
	if !b {
		result.Error(req, 500, "参数url不能为空")
		return
	}
	img, errMsg, err := genCode(content)
	if err != nil {
		result.Error(req, 500, errMsg+"："+err.Error())
		return
	}
	result.SuccessData(req, "二维码生成成功", img)
}

// @Tags 二维码
// @Summary 批量生成二维码(所有)
// @Produce json
// @Param url query string true "链接地址(小程序链接，扫码匹配对应的页面)"
// @Success 200 {object} result.Result "{"code": 200, "message": "二维码生成成功", "data": []}"
// @Failure 500 {object} result.Result "{ "code": 500, "message": "异常信息" }"
// @Router /batch/gen/code [GET]
func AllAreaQrCode(req *gin.Context) {
	url, b := req.GetQuery("url")
	if !b {
		result.Error(req, 500, "链接地址不能为空")
		return
	}
	rows, err := dao.AllArea(&model.Area{})
	if err != nil {
		result.Error(req, 500, "数据读取异常："+err.Error())
		return
	}
	// 创建类似java List<Object> 的对象
	images := tsgutils.NewInterfaceBuilder()
	for _, v := range rows {
		imgBase, errMsg, err := genCode(url + v.AreaCode)
		if err != nil {
			result.Error(req, 500, errMsg+"："+err.Error())
			return
		}
		// 循环将map对象装到集合中
		images.Append(gin.H{"image": imgBase, "name": v.Name, "shortName": v.ShortName})
	}
	// 将对象转换为集合ToInterfaces
	result.SuccessData(req, "二维码批量生成成功", images.ToInterfaces())
}

func genCode(content string) (imgBase string, errMsg string, err error) {
	// 获取工作目录
	dir, wdErr := os.Getwd()
	if wdErr != nil {
		return "", "获取工作目录失败", wdErr
	}
	// 读取logo、背景图片
	svgFile, svgErr := os.Open(dir + "/src/resource/image/logo.png")
	if svgErr != nil {
		return "", "logo获取异常", svgErr
	}
	// 自动开启和关闭流
	defer svgFile.Close()
	// 设置背景
	bgFile, bgErr := os.Open(dir + "/src/resource/image/qrcodeBg2.png")
	if bgErr != nil {
		return "", "背景获取异常", bgErr
	}
	defer bgFile.Close()
	logoImg, imgRErr := png.Decode(svgFile)
	bgImg, imgRErr := png.Decode(bgFile)
	if imgRErr != nil {
		return "", "PNG读取异常", imgRErr
	}
	// 获取背景图片大小
	qrCode, err := qrcode.New(content, qrcode.Highest)
	if err != nil {
		return "", "二维码生成异常", err
	}
	// 是否禁用边框
	qrCode.DisableBorder = true
	// 二维码颜色
	qrCode.ForegroundColor = color.RGBA{R: 99, G: 93, B: 223}
	qrCode.VersionNumber = 5
	codeImg := qrCode.Image(230)
	// 给二维码添加logo
	logoCodeImg, codeErr := common.CreateCenter(codeImg, logoImg)
	rgba, codeErr := common.CreateCenter(bgImg, logoCodeImg)
	if codeErr != nil {
		return "", "二维码合成异常", codeErr
	}
	// 创建一个空的流对象
	buffer := bytes.NewBuffer(nil)
	// 将图片写入流对象
	if pngErr := png.Encode(buffer, rgba); pngErr != nil {
		return "", "生成png异常", pngErr
	}
	// 将流对象转为base64 png
	imageBase := base64.StdEncoding.EncodeToString(buffer.Bytes())
	return "data:image/png;base64," + imageBase, "", nil
}
